/**
 * 一个用于处理 Promise 的实用函数，以更加结构化的方式处理。
 * 该函数允许捕获错误并将其返回为一致的 [error, data] 格式。
 *
 * @template T - Promise 成功解析时返回的数据类型。
 * @template U - Promise 被拒绝时返回的错误类型，默认为 `Error`。
 *
 * @param {Promise<T>} promise - 需要解析或捕获错误的 Promise。
 * @param {object} [errorExt] - （可选）扩展错误对象，用于添加额外的错误信息。
 *
 * @returns {Promise<[U, undefined] | [null, T]>} - 返回一个 Promise，结构为 [error, data]。
 *     - 如果 Promise 成功解析，返回 [null, data]。
 *     - 如果 Promise 失败，返回 [error, undefined]。当提供 `errorExt` 时，错误对象会被扩展。
 */
function resolveTo<T, U = Error>(promise: Promise<T>, errorExt?: object): Promise<[U, undefined] | [null, T]> {
    return promise
        .then<[null, T]>((data: T) => [null, data])
        .catch<[U, undefined]>((err: U) => {
            if (errorExt) {
                const parsedError = Object.assign({}, err, errorExt);
                return [parsedError, undefined];
            }

            return [err, undefined];
        });
}

export default resolveTo;
